package opencm.cli;

import org.joda.time.Duration;

import opencm.Agendamento;
import opencm.Consulta;
import opencm.Main;
import opencm.Medico;
import opencm.Paciente;
import opencm.RepositorioConsulta;
import opencm.RepositorioPaciente;

public class CancelarConsulta extends Acao {

	private RepositorioPaciente pacientes;
	private RepositorioConsulta consultas;

	public CancelarConsulta() {
		this.pacientes = Main.repositorioPaciente;
		this.consultas = Main.repositorioConsulta;
	}

	@Override
	public void executar() {
		Paciente paciente = selecionarUm("Paciente", this.pacientes.pesquisar());
		Consulta consulta = selecionarUm("Consulta", this.consultas.pesquisar(paciente));
		
		Agendamento anterior = consulta.desmarcar();
		consultas.remover(consulta);
		
		boolean remarcacao = false;
		Consulta consultaRemarcada = null;
		
		// Só faz sentido realocar consultas em espera por médico, porque precisamos
		// saber a duração da consulta de antemão.
		if (consulta.getTipo().equals(Consulta.Tipo.CONSULTA)) {
			for (Consulta espera : this.consultas.pesquisarListaDeEspera()) {
				if (espera.getAgendamento().getTipo().equals(Agendamento.Tipo.MEDICO)) {
					Medico medico = espera.getAgendamento().getMedico();
					Duration duracaoRequerida = medico.calculaDuracaoConsulta(espera);
					if (anterior.getDuracao().isLongerThan(duracaoRequerida)) {
						espera.remarcar(anterior);
						remarcacao = true;
						consultaRemarcada = espera;
						break;
					}
				}
			}			
		}
		
		out.println("Consulta cancelada com sucesso!");
		if (remarcacao) {
			out.printf("Uma consulta da lista de espera foi colocada no lugar:%n");
			out.println(consultaRemarcada.toString());
		}
	}

	@Override
	public String toString() {
		return "Cancelar Consulta";
	}
}
